import sys
from apscheduler.schedulers.blocking import BlockingScheduler
from TokenService import register_token_refresh_job, fetch_and_cache_token
from Fetcher import fetch_and_store_emergency_data
from DeviceService import sync_device_region_info

import logging
import time

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s'
)
logger = logging.getLogger(__name__)

if __name__ == "__main__":
    scheduler = BlockingScheduler()

    print("")
    logger.info("⏰ 开始启动定时任务...")

    # ========== 阶段一：优先初始化 Token 相关服务 ==========

    logger.info("🔒 正在初始化 Token 刷新服务...")
    register_token_refresh_job(scheduler)  # 注册每12小时刷新Token的任务

    logger.info("🔄 首次尝试获取 Token，请等待...")
    token_success = fetch_and_cache_token()  # 立即执行一次 token 获取
    if not token_success:
        logger.critical("🛑 Token 初始化失败，程序终止")
        sys.exit(1)

    logger.info("🔓 Token 初始化完成")

    # 强制等待几秒确保调度器稳定
    time.sleep(3)

    # ========== 阶段二：注册其他依赖 Token 的任务 ==========

    logger.info("📡 注册依赖 Token 的任务")

    # 启动时先执行一次
    fetch_and_store_emergency_data()
    sync_device_region_info()

    # 添加每5分钟执行一次的天气预警数据同步任务
    scheduler.add_job(
        func=fetch_and_store_emergency_data,
        trigger="interval",
        minutes=5,
        id='emergency_weather_job',
        name='天气预警数据同步任务',
        misfire_grace_time=30
    )

    # 添加每天凌晨1点执行一次的设备区域信息同步任务
    scheduler.add_job(
        func=sync_device_region_info,
        trigger="cron",
        hour=1,
        minute=0,
        id='device_region_sync_job',
        name='设备区域信息同步任务',
        misfire_grace_time=60
    )

    # ========== 最终：启动调度器 ==========

    logger.info("🚀 定时任务已全部加载完成，开始运行...")
    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        logger.info("🛑 定时任务已停止。")